// 基本 使用： on 订阅《key,cb》 emit《key,cb》 发布 off<key, cb?> 取消订阅
// 1. 通过队列存储事件《先进先出，保证顺序》
// 2. 订阅： 没有则创建一个数组，有则添加至对应的key下
// 3. 发布： 遍历key，执行对应的cb
// 4. 取消订阅： 遍历key，如果有cb，则删除对应的cb。 没有cb 则删除key 对应的所有cb
// 5. once： 注册一个回调函数，先执行，再取消
function mitt() {
  let all = new Map();
  // 订阅
  const on = (type, handler) => {
    if (!all.has(type)) {
      all.set(type, []);
    }
    all.get(type).push(handler);
    
    // let handlers = all.get(type);
    // if (handlers) {
    //   handlers.push(handler);
    // } else {
    //   all.set(type, [handler]);
    // }
  };
  // 发布
  const emit = (type, params) => {
    let handlers = all.get(type);
    if (handlers) {
      handlers.slice().map((handler) => handler(params));
    }
    // 没有查找到监听事件，判断是否监听了所有事件 *
    handlers = all.get("*");
    if (handlers) {
      handlers.slice().map((handler) => handler(params));
    }
  };
  // 取消订阅
  const off = (type, handler) => {
    let handlers = all.get(type);
    if (!handlers) return;
    if (handlers) {
      handler
        ? handlers.splice(handlers.indexOf(handler), 1)
        : (handlers.length = 0);
    }
  };
  // 只执行一次
  const once = (type, handler) => {
    const onceHandler = (args) => {
      handler(args);
      off(type, handler);
    };
    on(type, onceHandler);
  };
  return { all, on, emit, off, once };
}
let mt= mitt();
mt.on("foo", (e) => {
  console.log("foo 1", e);
});
mt.on("foo", (e) => {
  console.log("foo 2", e);
});

mt.on("*", (e) => {
  console.log("foo *", e);
});

// mt.off("foo", { a: 1});
// mt.off("foo", { a: 1 });
mt.emit("foo", { a: 1 });
mt.emit("foo", { a: 1 });
mt.all.clear()
console.log("mt", mt);
